package com.zkh.myutils.page;

import javax.servlet.http.HttpServletRequest;

import com.zkh.myutils.utils.StringUtils;

/**
 * 分页类，数据由自己手动查询并设置到本类中。本类只负责处理分页信息。<br /><br />
 * 
 * 注：如果通过dealPageinfo方法生成页码信息或者页码参数为pageIndex时，可通过getPageIndex获取当前页码。
 * @author zkh
 *
 */
public final class PageUtil<T> extends Pagination<T> {
	//每页显示的页码数，默认为5
	private int pageNumber=5;
	//分页信息
	private String pageinfo;
	
	/**
	 * 使用已有的分页类构建新的分页类<br />
	 * 自动装载总条数、总页数、每页显示大小、当前页码、分页信息
	 * @param page 分页类
	 */
	public <S> PageUtil(PageUtil<S> page){
		setTotalItem(page.getTotalItem());
		setTotalPage(page.getTotalPage());
		setPageItem(page.getPageItem());
		setPageIndex(page.getPageIndex());
		pageinfo = page.getPageinfo();
	}
	
	/**
	 * 分页类构造方法
	 * @param pageSize 每页显示条数
	 * @param pageIndex 当前页码
	 */
	public PageUtil(int pageItem, int pageIndex, long totalItem) {
		//基本属性
		setPageItem(pageItem);
		setPageIndex(Math.max(pageIndex, 1));
		setTotalItem(totalItem);
		//计算总页数
		setTotalPage((int) (totalItem%pageItem==0 ? totalItem/pageItem : totalItem/pageItem+1));
		setTotalPage(getTotalPage()==0 ? 1 : getTotalPage());
		//当前页码超出总页码数量
		if(getPageIndex()>getTotalPage()) {
			setPageIndex(getTotalPage());
		}
	}
	/**
	 * 获取分页信息
	 * @return
	 */
	public String getPageinfo() {
		return pageinfo;
	}
	/**
	 * 显示的页码数量，默认为5，获取页码信息时需要使用该参数
	 * @param pageNumber 页码数量
	 */
	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}

	/**
	 * 处理分页信息，默认以&lt;a href=""&gt;[1]&lt;/a&gt;的形式显示页码
	 * @param queryString 查询条件，可通过request.getQueryString()获取
	 */
	public void dealPageinfo(String queryString) {
		dealPageinfo(queryString, false);
	}
	
	/**
	 * 获取分页信息
	 * @param queryString 查询条件，可通过request.getQueryString()获取
	 * @param useLi 页码的显示方式是否使用&lt;li&gt;标签。<br>
	 * <li>true：&lt;ul class="pageinfo"&gt;&lt;li&gt;&lt;a href=""&gt;1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</li>
	 * <li>false：&lt;a href=""&gt;[1]&lt;/a&gt;</li>
	 */
	public void dealPageinfo(String queryString, boolean useLi){
		//获取起始位置
		int start,end;
		//临时变量
		int totalPage = getTotalPage(), pageIndex = getPageIndex();
		if(totalPage<pageNumber+1){
			start=1;
			end=totalPage;
		}else{
			if(pageIndex<pageNumber/2+1){
				start=1;
				end=pageNumber;
			}else if(pageIndex>totalPage-pageNumber/2){
				start=totalPage-pageNumber+1;
				end=totalPage;
			}else{
				start=pageIndex-pageNumber/2;
				end=pageIndex+(pageNumber%2==0?pageNumber/2-1:pageNumber/2);
			}
		}
		//声明一个保存分页信息的变量
		StringBuilder pageinfo = new StringBuilder();
		//是否显示首页和上一页
		if(useLi){	//添加<ul><li>
			pageinfo.append("<ul class=\"pageinfo\"><li>");
		}
		if(pageIndex!=1){
			if(useLi){
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,1)+"\">首页</a>");
				pageinfo.append("</li><li>");
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,pageIndex-1)+"\">上一页</a>");
				pageinfo.append("</li><li>");
			}else{
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,1)+"\">首页</a>");
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,pageIndex-1)+"\">上一页</a>");
			}
		}
		
		//显示页码
		for(int i=start;i<=end;i++){
			if(i==pageIndex){
				if(useLi){
					pageinfo.append(i);
					pageinfo.append("</li><li>");
				}else{
					pageinfo.append("["+i+"]");
				}
			}else{
				if(useLi){
					pageinfo.append("<a href=\"?"+formatQueryString(queryString,i)+"\">"+i+"</a>");
					pageinfo.append("</li><li>");
				}else{
					pageinfo.append("<a href=\"?"+formatQueryString(queryString,i)+"\">["+i+"]</a>");
				}
			}
		}
		
		//是否显示下一页和末页
		if(pageIndex!=totalPage){
			if(useLi){
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,pageIndex+1)+"\">下一页</a>");
				pageinfo.append("</li><li>");
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,totalPage)+"\">末页</a>");
				pageinfo.append("</li><li>");
			}else{
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,pageIndex+1)+"\">下一页</a>");
				pageinfo.append("<a href=\"?"+formatQueryString(queryString,totalPage)+"\">末页</a>");
			}
		}
		if(useLi){
			pageinfo.append("</li></ul>");
			//清除多余的<li></li>
			this.pageinfo = pageinfo.toString().replaceAll("<li></li>", "");
		}else{
			this.pageinfo = pageinfo.toString();
		}
		
	}
	
	/**
	 * 格式化queryString
	 * @param queryString
	 * @param pageIndex 要格式化的页码
	 * @return 格式化后的queryString
	 */
	private String formatQueryString(String queryString,int pageIndex){
		//如果queryString为空，则直接返回页码值
		if(queryString==null || queryString.isEmpty()){
			return "pageIndex="+pageIndex;
		}
		
		//格式化后的queryString
		StringBuilder url = new StringBuilder();
		
		//以&为分隔符分割出所有请求数据
		String[] querys = queryString.split("&");
		//循环遍历请求数据，如果存在pageIndex，则更新页码信息
		for(String query : querys){
			if(!query.contains("pageIndex")){
				url.append(query+"&");
			}else{
				url.append("pageIndex="+pageIndex+"&");
			}
		}
		if(url.indexOf("pageIndex=")==-1){
			url.append("pageIndex="+pageIndex+"&");
		}
		//去掉末尾的&符号并返回
		return url.substring(0, url.length()-1);
	}
	
	/**
	 * 获取当前页码，获取页码参数pageIndex的值。<br />
	 * 本分页类处理的分页信息，页码参数即为pageIndex。
	 * @param request
	 * @return
	 */
	public static int getPageIndex(HttpServletRequest request){
		//获取参数
		String pageIndex = request.getParameter("pageIndex");
		//判断是否为null，是否是数字
		if(!StringUtils.isNumber(pageIndex)){
			return 1;
		}else{
			return Integer.parseInt(pageIndex);
		}
	}
	
	@Override
	public String toString() {
		return "PageUtil [totalItem=" + getTotalItem() + ", pageItem=" + getPageItem()
				+ ", pageIndex=" + getPageIndex() + ", totalPage=" + getTotalPage()
				+ ", pageinfo=" + pageinfo + ", dataList=" + getDataList() + "]";
	}
}
